home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / Libraries / SAT 2.3.8 / Demos / HeartQuest demo ƒ / sPlayer.p < prev    next >
Text File  |  1996-05-23  |  4KB  |  164 lines

  1. {===============================================}
  2. {================= Player sprite unit ================}
  3. {===============================================}
  4.  
  5. { Example file for Ingemars Sprite Animation Toolkit. }
  6. { © Ingemar Ragnemalm 1992 }
  7. { See doc files for legal terms for using this code. }
  8.  
  9. { This file is the first of several sprite units, units that holds the full}
  10. {description of the objects to be animated. }
  11.  
  12. unit sPlayer;
  13.  
  14. { Sprite unit. A sprite unit should include the following routines:}
  15. { Init-procedure, that initializes private bitmaps}
  16. { Setup-procedure, that sets variables other than the standard ones set by MakeSprite }
  17. { Handle-procedure, to be called once per iteration until the sprite dies }
  18. { Hittask-procedure (optional), for advanced collission handling. }
  19.  
  20. { This is the sprite unit for the player object, in this case a butterfly. }
  21.  
  22. interface
  23.  
  24.     uses
  25. {$IFC UNDEFINED THINK_PASCAL}
  26.         Types, Quickdraw, Events,
  27. {$ENDC}
  28.         GameGlobals, SAT, sHeart, sFlypaper, scores, SoundConst;
  29.  
  30.     var
  31.         stillRunning: boolean;
  32.  
  33.     procedure InitPlayer;
  34.     procedure SetupPlayer (player: SpritePtr);
  35.     procedure HandlePlayer (me: SpritePtr);
  36.     procedure HitPlayer (me, him: SpritePtr);
  37.  
  38. implementation
  39.  
  40.     const
  41. {playerspeed = 16; { Might become a variable one day }
  42.         shift = 4;
  43.  
  44.     var
  45.         playerFace: array[0..3] of FacePtr;
  46.         posh, posv: longint;
  47.  
  48.     procedure InitPlayer;
  49.         var
  50.             ii: integer;
  51.     begin
  52.         for ii := 0 to 3 do
  53.             begin
  54.                 playerFace[ii] := SATGetFace(140 + ii);
  55.             end;
  56.     end;
  57.  
  58.     procedure SetupPlayer (player: SpritePtr);
  59.     begin
  60.         player^.face := playerFace[0];
  61.         SetRect(player^.hotRect, -15 + 16, -25 + 32, 15 + 16, 0 + 32);
  62.         posh := bsl(player^.position.h, shift);
  63.         posv := bsl(player^.position.v, shift);
  64.         slowcount := 0;
  65.         player^.task := @HandlePlayer;
  66.         player^.hittask := @HitPlayer;
  67.     end;
  68.  
  69.  
  70.     procedure HandlePlayer (me: SpritePtr);
  71.         var
  72.             pt: point;
  73.     begin
  74.         if me^.kind <> 2 then
  75.             me^.kind := 2;
  76.  
  77.         if slowcount > 0 then
  78.             begin
  79.                 slowcount := pred(slowcount);
  80.                 me^.speed := Point(0);
  81. {SetMouse(Point($00AB0100));???? {256,171}
  82.             end
  83.         else
  84.             begin
  85. {Note about the controls:}
  86. {(posh,posv) is the position scaled up by 16 (2**shift)}
  87. {This is my way to implement fixed-point arithmetics efficiently.}
  88. {If we used only integers, we wouldn't get the smooth movement the}
  89. {bufferfly has.}
  90.                 SetPort(gSAT.wind.port);
  91.                 GetMouse(pt);
  92.  
  93.                 if pt.h < 0 then
  94.                     pt.h := 0;
  95.                 if pt.h > 512 then
  96.                     pt.h := 512;
  97.                 if pt.v < 0 then
  98.                     pt.v := 0;
  99.                 if pt.v > 342 then
  100.                     pt.v := 342;
  101.  
  102.                 me^.speed.h := 15 * me^.speed.h div 16 + pt.h - 256;
  103.                 me^.speed.v := 15 * me^.speed.v div 16 + pt.v - 171;
  104.  
  105. {If we rather want the direct velocity-from-position that Crystal Quest has,}
  106. {we can use the following:}
  107. {me^.speed.h := pt.h - 256;}
  108. {me^.speed.v := pt.v - 171;}
  109.  
  110.                 SATSetMouse(Point($00AB0100));{256,171}
  111.  
  112.                 posh := posh + me^.speed.h;
  113.                 posv := posv + me^.speed.v;
  114.  
  115.                 me^.position.h := bsr(posh, shift);
  116.                 me^.position.v := bsr(posv, shift);
  117.  
  118.                 if me^.position.h > gSAT.offSizeH - xsize then
  119.                     begin
  120.                         me^.position.h := gSAT.offSizeH - xsize; { ev. xsize - 10? }
  121.                         posh := bsl(gSAT.offSizeH - xsize, shift);
  122.                     end;
  123.                 if me^.position.h < 0 then
  124.                     begin
  125.                         me^.position.h := 0;
  126.                         posh := 0;
  127.                     end;
  128.                 if me^.position.v > gSAT.offSizeV - 32 then
  129.                     begin
  130.                         me^.position.v := gSAT.offSizeV - 32; { ev. xsize - 10? }
  131.                         posv := bsl((gSAT.offSizeV - 32), shift);
  132.                     end;
  133.                 if me^.position.v < 0 then
  134.                     begin
  135.                         me^.position.v := 0;
  136.                         posv := 0;
  137.                     end;
  138.             end; { if slowcount... }
  139.  
  140.         me^.mode := me^.mode + 1;
  141.         if slowcount = 0 then
  142.             begin
  143.                 if me^.mode > 6 then
  144.                     begin
  145.                         me^.mode := 0;
  146.                     end;
  147.                 me^.face := playerFace[abs(me^.mode - 3)];
  148.             end
  149.         else
  150.             begin
  151.                 me^.face := playerFace[band(slowcount, 1) * 3];
  152.                 if slowcount = 1 then
  153.                     SATSoundPlay(splatt3SndH, 1, true);
  154.             end;
  155.  
  156.         playerPos := me^.position;
  157.     end;
  158.  
  159.     procedure HitPlayer (me, him: SpritePtr);
  160.     begin
  161. {This would be an alternative place to handle collisions. Not used in this program.}
  162.     end;
  163.  
  164. end.